﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DynaSpace.Entity;
using Microsoft.Xna.Framework;

namespace DynaSpace
{
	/// <summary>
	/// Třída reprezentující probíhající hru
	/// </summary>
	public class Playground
	{
		private EntityCollection map;
		private List<Player> players;
		internal Vector2 gravity;

		/// <summary>
		/// Konstruktor <see cref="Playground"/> s určenou šířkou a délkou
		/// </summary>
		/// <param name="width">Šířka v polích</param>
		/// <param name="height">Výška v polích</param>
		public Playground(int width, int height)
		{
			map = new EntityCollection(width, height);
			players = new List<Player>();
			gravity = new Vector2(0, 10);
		}

		/// <summary>
		/// Vrací kolekci všech <see cref="EntityBase">entit</see> na mapě
		/// </summary>
		public EntityCollection Map
		{
			get
			{
				return map;
			}
		}

		/// <summary>
		/// Vrací nebo nastavuje gravitaci pro pohon pohyblivých entit
		/// </summary>
		public Vector2 Gravity
		{
			get
			{
				return gravity;
			}
			set
			{
				gravity = value;
			}
		}

		/// <summary>
		/// Vrací kolekci hráčů
		/// </summary>
		public List<Player> Players
		{
			get
			{
				return players;
			}
		}

		/// <summary>
		/// Událost updatu vyvolaná každou herní smyčku
		/// </summary>
		public event EventHandler<UpdateEventArgs> Update;

		internal void OnUpdate(GameTime gameTime)
		{
			if (Update != null)
				Update.Invoke(this, new UpdateEventArgs(gameTime));

			Map.Update(gameTime);
		}

		/// <summary>
		/// Parametr události updatu objektu <see cref="Playground"/>
		/// </summary>
		public class UpdateEventArgs :EventArgs
		{
			internal UpdateEventArgs(GameTime gameTime)
			{
				this.GameTime = gameTime;
			}

			/// <summary>
			/// Aktuální herní čas
			/// </summary>
			public GameTime GameTime
			{
				get;
				private set;
			}
		}
	}
}
